/*
 * Facturacion.java
 *
 * Created on 2 de febrero de 2006, 13:14
 */

package administrador;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.sql.*;
import javax.swing.*;
import java.math.*;
import java.text.*;

//Probando
import org.jdesktop.application.Action;
/**
 *
 * @author  daniel1
 */
public class Facturacion extends javax.swing.JPanel {
    
    //Parametros:
    Conexion conexion;
    int s=0;
    int empleado=0;
    int bodega=1;
    String fecha;
    boolean actualizoSubtotal=true;
    boolean silimpio=false;
    javax.swing.JTabbedPane tp_controles;
    BuscadorProducto b;
    BuscadorProductoMayor bMayor;
    
    Usuario user;
    
    //Nath RedondeoF
    NumberFormat nf = NumberFormat.getNumberInstance();
    //ClientesFactura cfactura;
    
    //Referencia para cerrar la ventana desde el viewer:
    AdministradorView aviewer;
    
    
    //Variable para entrada de detalles ayuda a ubicar el foco al insertar un dato
    //que ya existe en la factura.
    int ultimoLineDetalle;
    
    /** Creates new form Facturacion */
    int opcionComprobante=0;
    String ventaMayor="";
    
    String terminal;

    //Creo el panel de imagenes
    BuscadorImagenes bimg;

    public Facturacion(Conexion cEnt,int BEnt,Usuario user,int opcionComprobante,javax.swing.JTabbedPane tp_controles,String ventaMayor) {
        
        this.tp_controles=tp_controles;
        this.ventaMayor=ventaMayor;
        DecimalFormat dec=(DecimalFormat)nf;
        dec.applyPattern("###.##");
        this.opcionComprobante=opcionComprobante;
        bodega=BEnt;
        System.out.println("La bodega en uso es:"+bodega);
        conexion=cEnt;
        initComponents();
        //Para que no puedan mover las Columnas:
        tabla.getTableHeader().setReorderingAllowed(false) ;
        
        terminal=recuperaTerminal(String.valueOf(bodega),"%");
        obtenParmetros();

        //Creo la ventana del Buscador:
        b=new BuscadorProducto(conexion,this,bodega);
        b.setVisible(false);
        //Por Mayor
        bMayor=new BuscadorProductoMayor(conexion,this,bodega);
        //Buscador de Imagenes:
        bimg=new BuscadorImagenes(conexion,bodega);

        this.user=user;
        jButton2.setVisible(false);
        if(ventaMayor.equals("Mayor")){
            jButton2.setVisible(true);
            bt_ap.setVisible(false);
            jLabel13.setText("Ventas X Mayor");
        }
        cargaVendedor(user);
        
//        bt_mod.setVisible(false);
        txt_nom.setEditable(false);
        txt_dir.setEditable(false);
        txt_tel.setEditable(false);
        fecha=new java.sql.Date(System.currentTimeMillis()).toString();
        lbl_fecha.setText(fecha);
        
        
        numeroFactura();
        
        //Configuro Redondeo
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
        
        //visualiza el valor del iva 
        txt_porIva.setText(consultarIva());
        //txt_porIva.setText("0.00");
        txt_codFac.setVisible(false);
        btn_BuscaFac.setVisible(false);
        btn_anulaFac.setVisible(false);
        this.ReImprimir.setVisible(false);
        jLabel10.setVisible(false);
        lbl_anulacion.setVisible(false);
        jScrollPane2.setVisible(false);
        lbl_fechaAnulacion.setVisible(false);
        lbl_etiqueta.setVisible(false);
        txt_subCosto.setVisible(false);
        columnaAnchos(50,100,0);
        columnaAnchos(40,40,1);
        columnaAnchos(100,500,2);//500
        columnaAnchos(50,50,3);
        columnaAnchos(50,50,4);
        columnaAnchos(0,0,5);
        columnaAnchos(0,0,6);


        if(user.getPrivilegio().equals("e")){
            btn_anulaFac.setEnabled(false);
            this.ReImprimir.setEnabled(false);
        }


    }
    public void columnaAnchos(int anchoMenor,int anchoMayor,int columnaNumero){
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMaxWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMinWidth(anchoMenor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setPreferredWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setResizable(false);
    }
    //Establesco lo referencia al administrador Viewer
    public void establecerReferencia(AdministradorView avEnt){
        aviewer=avEnt;
    
    }
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        txt_sub = new javax.swing.JTextField();
        txt_tot = new javax.swing.JTextArea();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabla = new javax.swing.JTable();
        bt_registra = new javax.swing.JButton();
        bt_limpiar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        txt_nom = new javax.swing.JTextField();
        txt_dir = new javax.swing.JTextField();
        txt_tel = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        txt_id = new javax.swing.JTextField();
        bt_mod = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        txt_porDesc = new javax.swing.JTextField();
        txt_porIva = new javax.swing.JTextField();
        bt_hist = new javax.swing.JButton();
        bt_ap = new javax.swing.JButton();
        bt_borrar = new javax.swing.JButton();
        jLabel14 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        lbl_vend = new javax.swing.JLabel();
        txt_vend = new javax.swing.JPasswordField();
        ck_desc = new javax.swing.JCheckBox();
        txt_desc = new javax.swing.JTextField();
        txt_iva = new javax.swing.JTextField();
        txt_codFac = new javax.swing.JTextField();
        btn_BuscaFac = new javax.swing.JButton();
        btn_anulaFac = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        txt_motAnula = new javax.swing.JTextArea();
        lbl_etiqueta = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        lbl_f = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        lbl_fecha = new javax.swing.JLabel();
        lbl_fechaAnulacion = new javax.swing.JLabel();
        lbl_anulacion = new javax.swing.JLabel();
        Sub_Desc = new javax.swing.JLabel();
        txt_SubDesc = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        txt_subCosto = new javax.swing.JTextField();
        lbl_fact = new javax.swing.JTextField();
        jScrollPane3 = new javax.swing.JScrollPane();
        jPanel2 = new javax.swing.JPanel();
        lbl_imagen = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        ReImprimir = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        subirWeb = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jLabel12 = new javax.swing.JLabel();

        jButton1.setText("jButton1");

        setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                formKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                formKeyTyped(evt);
            }
        });
        setLayout(null);

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel5.setText("Factura Nro: ");
        add(jLabel5);
        jLabel5.setBounds(30, 60, 100, 30);

        jLabel7.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel7.setText("Subtotal");
        add(jLabel7);
        jLabel7.setBounds(540, 450, 70, 20);

        jLabel8.setText("IVA");
        add(jLabel8);
        jLabel8.setBounds(540, 510, 70, 20);

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel9.setText("Total");
        add(jLabel9);
        jLabel9.setBounds(540, 530, 70, 20);

        txt_sub.setEditable(false);
        txt_sub.setText("0.00");
        txt_sub.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_sub.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_subActionPerformed(evt);
            }
        });
        add(txt_sub);
        txt_sub.setBounds(590, 450, 140, 20);

        txt_tot.setEditable(false);
        txt_tot.setFont(new java.awt.Font("Tahoma", 1, 11));
        txt_tot.setForeground(new java.awt.Color(204, 102, 0));
        txt_tot.setText("0.00");
        txt_tot.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        add(txt_tot);
        txt_tot.setBounds(590, 530, 140, 20);

        jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(198, 196, 196)));

        tabla.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        tabla.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null}
            },
            new String [] {
                "Codigo", "Cant.", "Articulo", "PVP", "Total", "Precio Costo", "Subtotal Costo"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                true, true, false, false, false, true, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabla.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tabla.getModel().addTableModelListener(new MyTableChangedListener());
        tabla.addInputMethodListener(new java.awt.event.InputMethodListener() {
            public void caretPositionChanged(java.awt.event.InputMethodEvent evt) {
            }
            public void inputMethodTextChanged(java.awt.event.InputMethodEvent evt) {
                tablaInputMethodTextChanged(evt);
            }
        });
        jScrollPane1.setViewportView(tabla);

        add(jScrollPane1);
        jScrollPane1.setBounds(30, 190, 700, 250);

        bt_registra.setText("Registrar");
        bt_registra.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_registraActionPerformed(evt);
            }
        });
        add(bt_registra);
        bt_registra.setBounds(770, 480, 110, 60);

        bt_limpiar.setText("Limpiar Todo");
        bt_limpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_limpiarActionPerformed(evt);
            }
        });
        add(bt_limpiar);
        bt_limpiar.setBounds(880, 510, 110, 30);

        jLabel1.setText("Nombre");
        add(jLabel1);
        jLabel1.setBounds(30, 100, 70, 30);

        jLabel2.setText("Direccion");
        add(jLabel2);
        jLabel2.setBounds(30, 130, 70, 20);

        jLabel3.setText("Telefono");
        add(jLabel3);
        jLabel3.setBounds(380, 130, 70, 20);
        add(txt_nom);
        txt_nom.setBounds(100, 100, 270, 30);
        add(txt_dir);
        txt_dir.setBounds(100, 130, 270, 50);
        add(txt_tel);
        txt_tel.setBounds(430, 130, 140, 20);

        jLabel4.setText("Cedula");
        add(jLabel4);
        jLabel4.setBounds(380, 100, 50, 20);

        txt_id.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_idKeyTyped(evt);
            }
        });
        add(txt_id);
        txt_id.setBounds(430, 100, 140, 20);

        bt_mod.setText("Crea-Modificar Cliente");
        bt_mod.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_modActionPerformed(evt);
            }
        });
        add(bt_mod);
        bt_mod.setBounds(590, 80, 140, 30);

        jLabel6.setText("Desc.");
        add(jLabel6);
        jLabel6.setBounds(540, 470, 50, 20);

        txt_porDesc.setText("0");
        txt_porDesc.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_porDesc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_porDescActionPerformed(evt);
            }
        });
        txt_porDesc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_porDescKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_porDescKeyTyped(evt);
            }
        });
        add(txt_porDesc);
        txt_porDesc.setBounds(590, 470, 40, 18);

        txt_porIva.setEditable(false);
        txt_porIva.setText("12");
        txt_porIva.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_porIva.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_porIvaKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_porIvaKeyTyped(evt);
            }
        });
        add(txt_porIva);
        txt_porIva.setBounds(590, 510, 40, 20);

        bt_hist.setText("Historia de Facturas");
        bt_hist.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_histActionPerformed(evt);
            }
        });
        add(bt_hist);
        bt_hist.setBounds(590, 110, 140, 30);

        bt_ap.setText("Aderir Producto");
        bt_ap.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_apActionPerformed(evt);
            }
        });
        add(bt_ap);
        bt_ap.setBounds(30, 440, 150, 40);

        bt_borrar.setText("Borrar Articulo");
        bt_borrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_borrarActionPerformed(evt);
            }
        });
        add(bt_borrar);
        bt_borrar.setBounds(180, 440, 110, 40);

        jLabel14.setForeground(new java.awt.Color(255, 153, 0));
        jLabel14.setText("Creacion");
        add(jLabel14);
        jLabel14.setBounds(210, 30, 70, 40);

        jLabel13.setFont(new java.awt.Font("Stencil", 1, 36));
        jLabel13.setForeground(new java.awt.Color(153, 0, 0));
        jLabel13.setText("Facturacion");
        add(jLabel13);
        jLabel13.setBounds(30, 10, 300, 45);

        lbl_vend.setForeground(new java.awt.Color(204, 0, 0));
        lbl_vend.setText("Vendedor");
        add(lbl_vend);
        lbl_vend.setBounds(450, 160, 70, 20);

        txt_vend.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_vendKeyTyped(evt);
            }
        });
        add(txt_vend);
        txt_vend.setBounds(500, 160, 70, 20);

        ck_desc.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        ck_desc.setMargin(new java.awt.Insets(0, 0, 0, 0));
        ck_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ck_descActionPerformed(evt);
            }
        });
        add(ck_desc);
        ck_desc.setBounds(730, 470, 20, 20);

        txt_desc.setEditable(false);
        txt_desc.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        txt_desc.setText("0.00");
        txt_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_descActionPerformed(evt);
            }
        });
        txt_desc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_descKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_descKeyTyped(evt);
            }
        });
        add(txt_desc);
        txt_desc.setBounds(630, 470, 100, 20);

        txt_iva.setEditable(false);
        txt_iva.setText("0.00");
        add(txt_iva);
        txt_iva.setBounds(630, 510, 100, 20);

        txt_codFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_codFacActionPerformed(evt);
            }
        });
        txt_codFac.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txt_codFacKeyPressed(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_codFacKeyTyped(evt);
            }
        });
        add(txt_codFac);
        txt_codFac.setBounds(160, 60, 140, 30);

        btn_BuscaFac.setText("Buscar");
        btn_BuscaFac.setName("bt_Buscar"); // NOI18N
        btn_BuscaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_BuscaFacActionPerformed(evt);
            }
        });
        add(btn_BuscaFac);
        btn_BuscaFac.setBounds(300, 60, 70, 30);

        btn_anulaFac.setText("Anular");
        btn_anulaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_anulaFacActionPerformed(evt);
            }
        });
        add(btn_anulaFac);
        btn_anulaFac.setBounds(40, 450, 90, 30);

        txt_motAnula.setColumns(20);
        txt_motAnula.setRows(3);
        txt_motAnula.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jScrollPane2.setViewportView(txt_motAnula);

        add(jScrollPane2);
        jScrollPane2.setBounds(30, 510, 460, 50);

        lbl_etiqueta.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lbl_etiqueta.setText("Razon de la Anulacion:");
        add(lbl_etiqueta);
        lbl_etiqueta.setBounds(340, 490, 150, 14);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanel1.setLayout(null);

        lbl_f.setFont(new java.awt.Font("Tahoma", 1, 12));
        lbl_f.setText("Fecha Emision:");
        jPanel1.add(lbl_f);
        lbl_f.setBounds(10, 10, 88, 15);

        jLabel10.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabel10.setText("Fecha Anulacion:");
        jPanel1.add(jLabel10);
        jLabel10.setBounds(10, 30, 120, 20);

        lbl_fecha.setFont(new java.awt.Font("MS Sans Serif", 0, 12));
        jPanel1.add(lbl_fecha);
        lbl_fecha.setBounds(130, 10, 110, 20);
        jPanel1.add(lbl_fechaAnulacion);
        lbl_fechaAnulacion.setBounds(130, 30, 100, 20);

        lbl_anulacion.setBackground(new java.awt.Color(255, 255, 255));
        lbl_anulacion.setFont(new java.awt.Font("Microsoft Sans Serif", 0, 12));
        jPanel1.add(lbl_anulacion);
        lbl_anulacion.setBounds(150, 30, 100, 20);

        add(jPanel1);
        jPanel1.setBounds(470, 20, 270, 60);

        Sub_Desc.setText("Sub-Desc");
        add(Sub_Desc);
        Sub_Desc.setBounds(540, 490, 50, 14);

        txt_SubDesc.setEditable(false);
        add(txt_SubDesc);
        txt_SubDesc.setBounds(590, 490, 140, 20);

        jButton2.setText("Aderir Producto");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        add(jButton2);
        jButton2.setBounds(30, 440, 150, 40);

        txt_subCosto.setText("0.00");
        add(txt_subCosto);
        txt_subCosto.setBounds(410, 450, 80, 20);

        lbl_fact.setEditable(false);
        add(lbl_fact);
        lbl_fact.setBounds(120, 60, 130, 30);

        jPanel2.setLayout(new java.awt.BorderLayout());
        jPanel2.add(lbl_imagen, java.awt.BorderLayout.CENTER);

        jScrollPane3.setViewportView(jPanel2);

        add(jScrollPane3);
        jScrollPane3.setBounds(770, 110, 470, 370);

        jLabel11.setText("Producto Seleccionado:");
        add(jLabel11);
        jLabel11.setBounds(770, 84, 140, 20);

        ReImprimir.setText("Reimprimir");
        ReImprimir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ReImprimirActionPerformed(evt);
            }
        });
        add(ReImprimir);
        ReImprimir.setBounds(880, 480, 110, 30);

        jButton3.setText("Buscar IMG");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        add(jButton3);
        jButton3.setBounds(370, 60, 90, 30);

        subirWeb.setText("Subir a Web");
        subirWeb.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                subirWebActionPerformed(evt);
            }
        });
        add(subirWeb);
        subirWeb.setBounds(30, 480, 110, 23);

        jButton4.setText("Historial Facturas Web");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });
        add(jButton4);
        jButton4.setBounds(590, 140, 140, 30);

        jButton5.setText("restaurarBaseconlaInternet");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });
        add(jButton5);
        jButton5.setBounds(760, 40, 170, 40);

        jLabel12.setText("Opcion de Restauracion:");
        add(jLabel12);
        jLabel12.setBounds(760, 20, 160, 14);
    }// </editor-fold>//GEN-END:initComponents
    
    private void txt_porIvaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porIvaKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_porIvaKeyReleased
    
    private void txt_descKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_descKeyReleased
    
    private void txt_porDescKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_porDescKeyReleased
    
    private void txt_porDescActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_porDescActionPerformed
// TODO add your handling code here:
        actualizoTotales();
        
    }//GEN-LAST:event_txt_porDescActionPerformed
    
    private void ck_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ck_descActionPerformed
// TODO add your handling code here:
        
        if(ck_desc.isSelected()){
            txt_porDesc.setText("%");
            txt_desc.setText("0");
            txt_porDesc.setEditable(false);
            txt_desc.setEditable(true);
            
        }else{
            txt_porDesc.setText("0");
            txt_desc.setText("0");
            txt_porDesc.setEditable(true);
            txt_desc.setEditable(false);
        }
        actualizoTotales();
    }//GEN-LAST:event_ck_descActionPerformed
    
    private void txt_vendKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_vendKeyTyped
// TODO add your handling code here:
        int presiona=evt.getKeyChar();
        if(presiona==10){
            String clave=txt_vend.getText();
            ResultSet resp=conexion.consultarBase("select * from usuario where clave=password('"+clave+"')");
            try {
                resp.beforeFirst();
                resp.next();
                String nombre=resp.getString(2);
                lbl_vend.setText(nombre);
                
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this,"Hay un error en la clave","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }
        txt_vend.setText("");    
        }
        
    }//GEN-LAST:event_txt_vendKeyTyped
    
    private void bt_borrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_borrarActionPerformed
// TODO add your handling code here:
    borrPro();
}//GEN-LAST:event_bt_borrarActionPerformed
    public void borrPro(){
        int fila=tabla.getSelectedRow();
        //System.out.println("La fila Seleccionada es:"+fila);
        if(fila==-1){
            JOptionPane.showMessageDialog(this,"Seleccione almenos un articulo para Borrarlo","Informacion",JOptionPane.INFORMATION_MESSAGE);
        } else {
            for(int i=0;i<5;i++){
                
                tabla.setValueAt(null,fila,i);
                
            }
            
        }
        txt_desc.setText("0.00");
        actualizoTotales();
    }
    
    
    
    private void formKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyReleased
// TODO add your handling code here:
        System.out.println(evt.getKeyCode());
    }//GEN-LAST:event_formKeyReleased
    
    private void bt_apActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_apActionPerformed
// TODO add your handling code here:
    addProd();
}//GEN-LAST:event_bt_apActionPerformed
    public void addProd(){
        tabla.clearSelection();
        b.setVisible(true);
        b.txt_buscar.setText("");
    }
    
    
    
    private void bt_histActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_histActionPerformed
// TODO add your handling code here:
        muestraHist();
        
}//GEN-LAST:event_bt_histActionPerformed
    public void muestraHist(){    
            VerFacturas v=new VerFacturas(conexion, bodega,user);
    }
    
    String textoIngresado="";
    private void txt_porDescKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyTyped
// TODO add your handling code here:
        int press=evt.getKeyChar();
        if(press==10){
            actualizoTotales();
        }
        //parte utilizada  para solo dejar ingrsar numeros 
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))&& c!='.') {
              getToolkit().beep();
              evt.consume();
        }
    }//GEN-LAST:event_txt_porDescKeyTyped
    
    private void txt_porIvaKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porIvaKeyTyped
// TODO add your handling code here:
        int press=evt.getKeyChar();
        if(press==10){
            actualizoTotales();
        }
    }//GEN-LAST:event_txt_porIvaKeyTyped
    
    private void formKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyTyped
// TODO add your handling code here:
        System.out.println(evt.getKeyChar());
    }//GEN-LAST:event_formKeyTyped
    
    private void bt_modActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_modActionPerformed
// TODO add your handling code here:
    cmCliente();
    }//GEN-LAST:event_bt_modActionPerformed
    public void cmCliente(){
        CreaCliente cc=new CreaCliente(conexion, txt_id.getText(),this,user);
    }
    
    
    
    private void txt_idKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_idKeyTyped
        //valido que no puedan ingresar mas que numeros
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
              getToolkit().beep();
              evt.consume();
        }
        int press=evt.getKeyChar();
        
        String textoV=this.txt_id.toString();
        if(!(textoV.length()>13)){
         evt.consume();
        }
        
        
        
        //Limpio si escribes otro codigo
        txt_nom.setText("");
        txt_tel.setText("");
        txt_dir.setText("");
        
        //Si es Enter:
        
        if(press==10){
//        bt_mod.setVisible(true);
            ResultSet r;
            String codigo=txt_id.getText();
            codigo=codigo.replaceAll(" ","");
            
            //Consulto si es que Existe el Cliente:
            r=conexion.consultarBase("select nombre,apellido,direccion,telefono from cliente where cod_cliente like '"+codigo+"'");
            String cod,cli,nom,ape,dir,tel;
            
            try{
                //***************************************
                //En el caso de que el cliente no exista:
                r.last();
                int filas=r.getRow();
                if(filas==0){
                    System.out.println("Cliente no existe");
                    CreaCliente cc=new CreaCliente(conexion, txt_id.getText(),this,user);
                } else{
                    //***************************************
                    //En el caso de que el cliente exista:
                    r.beforeFirst();
                    while(r.next()){
                        nom=r.getString(1);
                        ape=r.getString(2);
                        dir=r.getString(3);
                        tel=r.getString(4);
                        
                        txt_nom.setText(nom+" "+ape);
                        txt_dir.setText(dir);
                        txt_tel.setText(tel);
                    }
                }
            }catch(SQLException sqle){
                System.out.println("Error Consulta Cliente");
                System.err.println(sqle);
            }
            
        }
        
    }//GEN-LAST:event_txt_idKeyTyped
    
    private void bt_limpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_limpiarActionPerformed
// TODO add your handling code here:
        limpiar();
        
}//GEN-LAST:event_bt_limpiarActionPerformed
    public void cargaVendedor(Usuario user){
        lbl_vend.setText(user.nombre);
    }
    
    
    public void limpiar(){
        silimpio=true;
        //Limpio Tabla
        int filas=tabla.getRowCount();
        int cont=0;
        while(cont<filas){
            try{
                for(int i=0;i<6;i++){
                    //System.out.println("valor fila:"+cont+" columnas: "+i);
                    tabla.setValueAt(null,cont,i);
                    // System.out.println(toma);
                }
            }catch(Exception e){};
            cont++;
        }
        //Limpio de texto
        txt_sub.setText("0.00");
        txt_subCosto.setText("0.00");
        txt_tot.setText("0.00");
        txt_desc.setText("0.00");
        txt_iva.setText("0.00");
        txt_vend.setText("");
        //limpio porcentajes:
        txt_porDesc.setText("0");
        txt_SubDesc.setText("0.00");
        //txt_porIva.setText("0");
        //Otro panel
        txt_id.setText("");
        txt_nom.setText("");
        txt_dir.setText("");
        txt_tel.setText("");
        
        cargaVendedor(user);
        
        int n=numeroFactura();
        pongoNumtab(n);
        
        silimpio=false;
    }
    
    public void pongoNumtab(int numero){
    //Refresco el Tab y le pongo el numero de Factura Nuevo:
            int seleccion=tp_controles.getSelectedIndex();
            if(seleccion!=0){
            String[] titulo=tp_controles.getTitleAt(seleccion).split("#");
            
            tp_controles.setTitleAt(seleccion,titulo[0]+"#"+String.valueOf(numero));
            }
    
    }
    
    public int numeroFactura(){
        int numeroFactura=0;
        try{
            ResultSet codInicioSri=conexion.consultarBase("select max(num_secuencia) from tipo_comprobante where nombre='Factura'");
            codInicioSri.next();
            ResultSet r=conexion.consultarBase("select MAX(cod_pedido) from pedido  where tipo_comprobante='F'");
            r.next();
            int numero=r.getInt(1);
            int numeroSri=codInicioSri.getInt(1);
            if(numero==0 || numero<numeroSri){
               numero= numeroSri;
            }else{
                numero+=1;
            }
            System.out.println("Numero Factura Generado: "+numero);
            lbl_fact.setText(String.valueOf(numero));
            
            
            
            numeroFactura=numero;
        } catch(java.sql.SQLException e){};
        return numeroFactura;
    }
    
    public void bt_registraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_registraActionPerformed
    aplastoRegistrar();
    }//GEN-LAST:event_bt_registraActionPerformed
    @Action
    public void aplastoRegistrar(){
    int opccion=0;
        opccion=JOptionPane.showConfirmDialog(this,"Seguro Desea Guardar esta Factura?","Alerta",0);
        if(opccion==0){
           int cantProductos=this.cuentaProductos(); 
           System.out.println("La cantidad de productos es:"+cantProductos);
           if(!txt_id.getText().equals("")&&!txt_tot.getText().equals("0.00")&&cantProductos>0){
            int numFact=Integer.parseInt(lbl_fact.getText());
            FPagoAdmin fpa=new FPagoAdmin(this,conexion,numFact,user);
            
           }else{
             JOptionPane.showMessageDialog(this,"Complete todos los datos de la factura","Informacion",JOptionPane.INFORMATION_MESSAGE);
           
           }
            
            
            
        }
    }
    String NombreRS="";
    String RucEmisor="";
    String DireccionLocal="";
    String AutSRI="";
    String FechaCaducidad="";
    String NombreDueno="";
    public  void obtenParmetros(){
        java.util.Vector vec=conexion.consulta("select * from parametros limit 1");
        java.util.Vector vecInterno=new java.util.Vector();
        for(int i=0;i<vec.size();i++){
            vecInterno=(java.util.Vector)vec.elementAt(i);
                NombreRS=vecInterno.elementAt(1).toString();
                NombreDueno=vecInterno.elementAt(8).toString();
                RucEmisor=vecInterno.elementAt(2).toString();
                DireccionLocal=vecInterno.elementAt(3).toString();
                AutSRI=vecInterno.elementAt(6).toString();
                FechaCaducidad=vecInterno.elementAt(7).toString();
        }
    }
    public String recuperaTerminal(String codSucursal,String mac){
        String consultaTerminal="select t.cod_terminales "+
                                "from   bodega b,terminales t "+
                                "where  b.cod_bodega=t.cod_bodega and identificador like '"+mac+"' and b.cod_bodega="+codSucursal+" limit 1";
        System.out.println(consultaTerminal+"^&");
        String terminal="";
        java.util.Vector vec=conexion.consulta(consultaTerminal);
        java.util.Vector vecInt=new java.util.Vector();
        for(int i=0;i<vec.size();i++){
            vecInt=(java.util.Vector)vec.elementAt(i);
            terminal=vecInt.elementAt(0).toString();
        }
        return terminal;
    }
    public void asientoEfectivo(){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Factura  # F_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","1","0",txt_tot.getText(),"0");   //Asiento de Caja  debe
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",txt_sub.getText());   //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",txt_iva.getText());   //Iva en Ventas  haber
    }
    public void asientoCuentasCobrar(){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Factura # F_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","1","0",txt_tot.getText(),"0");   //Asiento Cuentas x Cobrar
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",txt_sub.getText());   //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",txt_iva.getText());   //Iva en Ventas  haber
    }
    public void asientoCuentasCredito(){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Factura # F_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"6","1","2","0",txt_tot.getText(),"0");   //Asiento Cuentas x Cobrar
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",txt_sub.getText());   //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",txt_iva.getText());   //Iva en Ventas  haber
    }
    public void asientoCostos(){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Factura # FC_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"13","1","4","0",txt_subCosto.getText(),"0");   //Ventas cosot
            asientoDeatlle(numeroAsiento,numeroDiario,"5","1","1","0","0",txt_subCosto.getText());   //inventario de mercaderias
    }
    public void asientoAnula(String cod_Comprobante){
            String consulta="select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "+
                            "from dtl_asiento d,tercernivel t,asiento ass "+
                            "where t.cod_tercernivel=d.cod_tercernivel "+
                            "and t.cod_segundonivel=d.cod_segundonivel "+
                            "and t.cod_primernivel=d.cod_primernivel and "+
                            "ass.cod_asiento=d.cod_asiento and "+
                            "ass.referencia like '%F_"+cod_Comprobante+"%'";
            java.util.Vector vecPrincipal=conexion.consulta(consulta);
            java.util.Vector vecInterno=new java.util.Vector();
            String numeroDiario=numeroDiario();
            asiento(numeroDiario,fecha,"Anulacion de Factura # "+txt_codFac.getText());
            String numeroAsiento=numeroAsiento();
            for(int i=0;i<vecPrincipal.size();i++){
                vecInterno=(java.util.Vector)vecPrincipal.elementAt(i);
                asientoDeatlle(numeroAsiento,numeroDiario,vecInterno.elementAt(0).toString(),vecInterno.elementAt(1).toString(),vecInterno.elementAt(2).toString(),"0",vecInterno.elementAt(4).toString(),vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }
    }
    public void asientoAnulaCosto(String cod_Comprobante){
            String consulta="select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "+
                            "from dtl_asiento d,tercernivel t,asiento ass "+
                            "where t.cod_tercernivel=d.cod_tercernivel "+
                            "and t.cod_segundonivel=d.cod_segundonivel "+
                            "and t.cod_primernivel=d.cod_primernivel and "+
                            "ass.cod_asiento=d.cod_asiento and "+
                            "ass.referencia like '%FC_"+cod_Comprobante+"%'";
            java.util.Vector vecPrincipal=conexion.consulta(consulta);
            java.util.Vector vecInterno=new java.util.Vector();
            String numeroDiario=numeroDiario();
            asiento(numeroDiario,fecha,"Anulacion de Factura # "+txt_codFac.getText());
            String numeroAsiento=numeroAsiento();
            for(int i=0;i<vecPrincipal.size();i++){
                vecInterno=(java.util.Vector)vecPrincipal.elementAt(i);
                asientoDeatlle(numeroAsiento,numeroDiario,vecInterno.elementAt(0).toString(),vecInterno.elementAt(1).toString(),vecInterno.elementAt(2).toString(),"0",vecInterno.elementAt(4).toString(),vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }
    }
    public String numeroDiario(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select  cod_diario from diario where fecha_diario=(select max(fecha_diario) from diario) limit 1");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    public String numeroAsiento(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select max(cod_asiento) from asiento");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    public void asiento(String numeroDiario,String fecha,String referencia){
        conexion.insertarDatos("insert into asiento(cod_diario,fecha_dia,referencia) values("+numeroDiario+",'"+fecha+"','"+referencia+"')");
    }
    public void asientoDeatlle(String numeroAsiento,String numeroDiario,String n3,String n2,String n1,String parcial,String debe,String haber){
        String consultaDtlAs= "insert into dtl_asiento "+
                              "(cod_diario,cod_asiento,cod_tercernivel,cod_segundonivel,cod_primernivel,parcial,debe,haber) " +
                              "values ("+numeroDiario+","+numeroAsiento+","+n3+","+n2+","+n1+","+parcial+","+debe+","+haber+")";
        conexion.insertarDatos(consultaDtlAs);
    }
    MacAddress macA=new MacAddress();
    public void registrarFactura(String documento,int orig,int tipoPago){
        //Inicio la Transaccion de Insercion de Facturas:
        conexion.consultarBase("START TRANSACTION;");
        //
        int original=orig;
        String Doc=documento;
        numeroFactura();
        System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
        if(!txt_id.getText().equals("")&&!txt_tot.getText().equals("0.0")){

            //Creo el trabajo de impresion: =========================
            //Imprimir TrabImpresion=new Imprimir(this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),Doc);
            //inserto cabecera factura;
            //String terminal=recuperaTerminal(String.valueOf(bodega),macA.mac());
            Imprimir TrabImpresion;
            transaccionesErradas TrabImpresionErrada;
            if(this.ventaMayor.equals("Mayor")){

            TrabImpresion=new Imprimir(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"FactxMayor",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);
            //NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad) {
            TrabImpresionErrada=new transaccionesErradas(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"FactxMayor",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);

            }else{
            TrabImpresion=new Imprimir(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"Factura",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);
            //NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad) {
            TrabImpresionErrada=new transaccionesErradas(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"Factura",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);
            }

            String hora=new java.sql.Time(System.currentTimeMillis()).toString();
            String fecha=new java.sql.Date(System.currentTimeMillis()).toString();
            System.out.println("@@@ Ingreso la cabecera de factura  @@@");
            conexion.insertarDatos("insert into pedido values("+lbl_fact.getText()+",'"+txt_id.getText()+"','"+txt_dir.getText()+"','"+fecha+"','Cuenca','Ecuador','Azuay','"+txt_tel.getText()+"','"+lbl_vend.getText()+"',"+txt_tot.getText()+","+txt_porIva.getText()+","+txt_desc.getText()+","+txt_sub.getText()+",'A',null,'','F','"+String.valueOf(bodega)+"','"+terminal+"',"+AutSRI+")");
            System.out.println("@@@FIN Ingreso la cabecera de factura  @@@");
            //Inserto detalle factura;
            if(tipoPago==0){ //Cliente pago en efectivo
                asientoEfectivo();
                asientoCostos();
            }else if(tipoPago==1){ //Cuentas x Cobrar
                asientoCuentasCobrar();
                asientoCostos();
            }else if(tipoPago==2){ //Cuentas x Credito
                asientoCuentasCredito();
                asientoCostos();
            }
            //asientoEfectivoDtlge
            int filas=tabla.getRowCount();
            //System.out.println("Las fila editadas son"+filas);
            int cont=0;

            int NumProductos=cuentaProductos();
            int ProdVerificados=0;
            //Inserto los titulos de la Factura:
              TrabImpresion.escriboFact(TrabImpresion.pongoTitulos(""));
              TrabImpresionErrada.escriboFact(TrabImpresionErrada.pongoTitulos(""));
            while(cont<filas){
                System.out.println("Comienza el while");
                try{
                    String codigoPro=tabla.getValueAt(cont,0).toString();
                    String cantProVendido=tabla.getValueAt(cont,1).toString();
                    String subTot=tabla.getValueAt(cont,4).toString();


                    //Inserto detalle en el archivo de Impresion:
                    TrabImpresion.insertoDetImp(codigoPro,tabla.getValueAt(cont,2).toString(),cantProVendido,tabla.getValueAt(cont,3).toString(),subTot);
                    TrabImpresionErrada.insertoDetImp(codigoPro,tabla.getValueAt(cont,2).toString(),cantProVendido,tabla.getValueAt(cont,3).toString(),subTot);
                    //Realizo la Insercion del los Producto que conforman el detalle:

                    System.out.println("@@@  Ingreso Detalle Factura ----- @@@");
                    conexion.insertarDatos("insert into dtl_pedido values("+lbl_fact.getText()+",'"+codigoPro/*Codigo*/+"',"+cantProVendido/*Cantidad*/+","+subTot/*Subtotal*/+",'F')");
                    System.out.println("@@@ FIN Ingreso Detalle Factura ----- @@@");

                    System.out.println(" El dato con null es*"+codigoPro+"**"+cantProVendido+"*");
                    boolean actualizacionVer=actualizoStock(codigoPro,Integer.parseInt(cantProVendido));

                    //Verifico Insercion del Detalle:
                    boolean detalleVerific=false;
                    ResultSet rsverific=conexion.consultarBase("SELECT * FROM dtl_pedido where cod_pedido="+lbl_fact.getText()+" and cod_producto='"+codigoPro+"' and cantidad="+cantProVendido+" and subtotal="+subTot+" and tipoDoc like 'F';");
                    if(conexion.obtenerFilas(rsverific)>0){
                        detalleVerific=true;
                    }
                    //Verifico El Ingreso del detalle y la actualizacion del Producto:
                    if(actualizacionVer&&detalleVerific){
                        ProdVerificados++;
                    }
                }catch(Exception e){
                    // System.err.println(e);
                }
                cont++;
            }
            //Verifico que todos los producto se han verificado:
            if (NumProductos==ProdVerificados){
                //Insercion Verificada
                //###################################
                conexion.consultarBase("COMMIT;");
                //###################################
                //Introdusco Total en el archivo a Imprimir:
                String Pie=TrabImpresion.pieFactura(txt_sub.getText().toString(),txt_desc.getText().toString(),txt_iva.getText().toString(),txt_tot.getText().toString());
                TrabImpresion.escriboFact(Pie);
                //borro el archivo Error Temporal
                TrabImpresionErrada.getArchivo().borrarArchivo(TrabImpresionErrada.getArchivo().sacoFile());



                //Introdusco el Original.
                String Etiqueta="";
                TrabImpresion.escriboFact(Etiqueta);
                //Imprimo:
                TrabImpresion.printString(TrabImpresion.texto);
                //TrabImpresion.realizaImprecion();

                //---------------------------------------------
                //Para el caso que se necesite una copia:
                /*int opccion=0;
                opccion=JOptionPane.showConfirmDialog(this,"Desea Imprimir una Copia?","Alerta",0);
                if(opccion==0){
                    //Reemplazo el texto que dice copia por el nuevo texto del archivo
                    Archivo archivo=TrabImpresion.getArchivo();
                    archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Original **","           ** Copia **");
                    TrabImpresion.realizaImprecion();
                     //Le regreso como estaba al principio
                    archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Copia **","           ** Original **");

                }*/


                //cerrarTab();
                limpiar();
                conexion.limpiar(tabla);

            }else{
                  TrabImpresion.getArchivo().borrarArchivo(TrabImpresion.getArchivo().sacoFile());
                try {
                    //Se dio un problema al guardar o actualizar los productos de la factura:
                    String Pies=TrabImpresionErrada.pieFactura(txt_sub.getText().toString(),txt_desc.getText().toString(),txt_iva.getText().toString(),txt_tot.getText().toString());
                    TrabImpresionErrada.escriboFact(Pies);
                    //TrabImpresionErrada.realizaImprecion();

                } catch (Exception ex) {
                    Logger.getLogger(Facturacion.class.getName()).log(Level.SEVERE, null, ex);
                }
                conexion.consultarBase("ROLLBACK;");
                JOptionPane.showMessageDialog(this,"LA FACTURA NO SE GRABO DEBIDO A ALGUN PROBLEMA  EN LA ACTUALIZACION DE LOS PRODUCTOS O EN LA INSERCION DE LOS DETALLES  ","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }


        }else{
            JOptionPane.showMessageDialog(this,"Complete todos los datos de la factura","Informacion",JOptionPane.INFORMATION_MESSAGE);

        }


    }


    //Este Metodo Registra la Factura en la Web
    public void registrarFactWeb() {

        //Realizo la Conexion a la base de datos Web:
        //Conexion a la Base del Internet
//        String IPCliente = "174.136.152.21";// "174.136.152.21";
//        String nombre = "daniel1";//"daniel1";
//        String password = "yxes1984";
//        String dbcliente = "sexylocuras_mysql4608ff1c2ef2";
//        String puerto = "3306";
        
        String IPCliente = "174.136.152.21";// "174.136.152.21";
        String nombre = "sexyusuario";//"daniel1";
        String password = "yxes1984";
        String dbcliente = "sexylocuras";
        String puerto = "3306";
        
        //String IDCliente = "3";   // Bodega

        //Realizo la conexion a la base de datos cliente:
        Conexion conexionWeb = new Conexion();
        if (!conexionWeb.conectarBase(nombre, password, puerto, dbcliente, IPCliente)) {
            System.out.println("No pudo establecer la conexion primera");
            JOptionPane.showMessageDialog(this, "No se pudo establecer conexion con la base de datos del Internet !!", "Informacion", JOptionPane.WARNING_MESSAGE);

        } else {
            //Conexion Exitosa Comienzo a Actualizar la Base Internet:

             //Borro los datos que estan actualmente

            conexionWeb.actualizarBase("delete from envio where cod_factura="+this.lbl_fact.getText()+";");



            int filas = tabla.getRowCount();
            int cont = 0;
            int contIngresoWeb=0;

            //Inicio Transaccion
            conexionWeb.consultarBase("START TRANSACTION;");

            //Obtengo la Cantidad de Productos a Ingresar:
            int numeroProductos=this.cuentaProductos();



            while (cont < filas) {
                System.out.println("Comienza el while");
                try {
                    String codigoPro = tabla.getValueAt(cont, 0).toString();
                    String cantProVendido = tabla.getValueAt(cont, 1).toString();
                    String precio_normal = tabla.getValueAt(cont, 3).toString();
                    String precio_costo = tabla.getValueAt(cont, 5).toString();


                    //Si es una factura al por mayor tiene que registrarse en la web el precio de venta real y el costo es el de distribucion.
                    if(this.ventaMayor.equals("Mayor")){
                    precio_costo=precio_normal;

                    ResultSet respuest=conexion.consultarBase("SELECT precio_normal FROM producto where cod_producto like '"+codigoPro+"';");
                    respuest.beforeFirst();
                    respuest.next();
                    precio_normal=String.valueOf(respuest.getDouble(1));


                    }


                    //Datos de la Consulta a tabla productos:
                    String nombrePro="";
                    String descPro="";
                    int catPro=0;
                    
                    //Saco los datos para crear el producto:
                    ResultSet renvio=conexion.consultarBase("SELECT cod_categoria,nombre,descripcion FROM producto where cod_producto like '"+codigoPro+"';");
                    int obtenidos=conexion.obtenerFilas(renvio);
                    renvio.beforeFirst();
                    renvio.next();
                    catPro=renvio.getInt(1);
                    nombrePro=renvio.getString(2);
                    descPro=renvio.getString(3);
                    
                    //Saco Otros datos Necesario
                    String fechaPro=new java.sql.Date(System.currentTimeMillis()).toString();

                    //Saco Observacion:
                    String observacion="";

                    //Lleno el dato de la Observacion,, Con datos de la Cabecera Factura:
                    observacion=observacion+"" +
                            "Destino: " +this.txt_nom.getText()+"\n" +
                            "Factura #: "+this.lbl_fact.getText()+ "\n" +
                            "Direccion: "+this.txt_dir.getText()  ;
                            


                    boolean exito=false;
                    //Realizo la insercion en la Base de datos Web:
                    exito=conexionWeb.insertarDatosR("insert into envio values(null,'"+codigoPro+"',"+catPro+",'"+nombrePro+"','"+descPro+"',"+cantProVendido+","+precio_normal+","+precio_costo+",'"+fechaPro+"','"+observacion+"',null,null,0,"+lbl_fact.getText()+",null,"+txt_id.getText()+");");

                    if(exito){
                    contIngresoWeb++;
                    }

                } catch (Exception e) {
                    // System.err.println(e);
                }
                cont++;

            }

            if(contIngresoWeb==numeroProductos){
                conexionWeb.consultarBase("COMMIT;");
            }else{
                conexion.consultarBase("ROLLBACK;");
                JOptionPane.showMessageDialog(this,"LA FACTURA PARA EL REGISTRO WEB:\n NO SE GRABO DEBIDO A ALGUN PROBLEMA  EN LA ACTUALIZACION DE LOS PRODUCTOS\n O EN LA INSERCION DE LOS DETALLES  ","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }

        }
        try {
            //Cierro la Conexion:
            conexionWeb.cerrarConexion();
        } catch (Exception ex) {
            Logger.getLogger(Facturacion.class.getName()).log(Level.SEVERE, null, ex);
        }

    }





    //Este Metodo Registra la Factura en la Web
    public void registrarNuevamenteFactWeb(JTable tabla) {



        //Realizo la Conexion a la base de datos Web:
        //Conexion a la Base del Internet
//        String IPCliente = "174.136.152.21";// "174.136.152.21";
//        String nombre = "daniel1";//"daniel1";
//        String password = "yxes1984";
//        String dbcliente = "sexylocuras_mysql4608ff1c2ef2";
//        String puerto = "3306";
//        
        
        String IPCliente = "174.136.152.21";// "174.136.152.21";
        String nombre = "sexyusuario";//"daniel1";
        String password = "yxes1984";
        String dbcliente = "sexylocuras";
        String puerto = "3306";
       // String IDCliente = "3";   // Bodega

        //Realizo la conexion a la base de datos cliente:
        Conexion conexionWeb = new Conexion();
        if (!conexionWeb.conectarBase(nombre, password, puerto, dbcliente, IPCliente)) {
            System.out.println("No pudo establecer la conexion primera");
            JOptionPane.showMessageDialog(this, "No se pudo establecer conexion con la base de datos del Internet !!", "Informacion", JOptionPane.WARNING_MESSAGE);

        } else {
            //Conexion Exitosa Comienzo a Actualizar la Base Internet:

            //Borro los datos que estan actualmente

            conexionWeb.actualizarBase("delete from envio where cod_factura="+this.txt_codFac.getText()+";");

            int filas = tabla.getRowCount();
            int cont = 0;
            int contIngresoWeb=0;

            //Inicio Transaccion
            conexionWeb.consultarBase("START TRANSACTION;");

            //Obtengo la Cantidad de Productos a Ingresar:
            int numeroProductos=this.cuentaVisorProductos(tabla1);

            while (cont < filas) {
                System.out.println("Comienza el while");
                try {
                    String codigoPro = tabla.getValueAt(cont, 0).toString();
                    String cantProVendido = tabla.getValueAt(cont, 1).toString();
                    

                    //Datos de la Consulta a tabla productos:
                    String nombrePro="";
                    String descPro="";
                    int catPro=0;

                    //Saco los datos para crear el producto:
                    ResultSet renvio=conexion.consultarBase("SELECT cod_categoria,nombre,descripcion,precio_normal,precio_costo,precio_distribucion FROM producto where cod_producto like '"+codigoPro+"';");
                    int obtenidos=conexion.obtenerFilas(renvio);
                    renvio.beforeFirst();
                    renvio.next();
                    catPro=renvio.getInt(1);
                    nombrePro=renvio.getString(2);
                    descPro=renvio.getString(3);
                    Double precioNormal=renvio.getDouble(4);
                    Double precioCosto=renvio.getDouble(5);
                    Double precioDistribucion=renvio.getDouble(6);

                     //Si es una factura al por mayor tiene que registrarse en la web el precio de venta real y el costo es el de distribucion.
                    if(this.ventaMayor.equals("Mayor")){
                    precioCosto=precioNormal;

                    ResultSet respuest=conexion.consultarBase("SELECT precio_normal FROM producto where cod_producto like '"+codigoPro+"';");
                    respuest.beforeFirst();
                    respuest.next();
                    precioNormal=respuest.getDouble(1);

                    }


                    //Saco Otros datos Necesario
                    String fechaPro=new java.sql.Date(System.currentTimeMillis()).toString();

                    //Saco Observacion:
                    String observacion="";

                    //Lleno el dato de la Observacion,, Con datos de la Cabecera Factura:
                    observacion=observacion+"" +
                            "Factura de Envio # "+this.lbl_fact.getText()+ "\n" +
                            "Local Destino: " +this.txt_nom.getText()+"\n" +
                            "Direccion: "+this.txt_dir.getText()  ;


                    boolean exito=false;
                    //Realizo la insercion en la Base de datos Web:
                    exito=conexionWeb.insertarDatosR("insert into envio values(null,'"+codigoPro+"',"+catPro+",'"+nombrePro+"','"+descPro+"',"+cantProVendido+","+precioNormal+","+precioDistribucion+",'"+fechaPro+"','"+observacion+"',null,null,0,"+txt_codFac.getText()+",null,"+txt_id.getText()+");");

                    if(exito){
                    contIngresoWeb++;
                    }

                } catch (Exception e) {
                    // System.err.println(e);
                }
                cont++;

            }

            if(contIngresoWeb==numeroProductos){
                conexionWeb.consultarBase("COMMIT;");
            }else{
                conexion.consultarBase("ROLLBACK;");
                JOptionPane.showMessageDialog(this,"LA FACTURA PARA EL REGISTRO WEB:\n NO SE GRABO DEBIDO A ALGUN PROBLEMA  EN LA ACTUALIZACION DE LOS PRODUCTOS\n O EN LA INSERCION DE LOS DETALLES  ","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }

        }
        try {
            //Cierro la Conexion:
            conexionWeb.cerrarConexion();
        } catch (Exception ex) {
            Logger.getLogger(Facturacion.class.getName()).log(Level.SEVERE, null, ex);
        }

    }




    
    @Action
    public void cerrarTab(){
      int seleccion=aviewer.tp_controles.getSelectedIndex();
      
      if(seleccion==0){
      
      }else{
      aviewer.ventanas.remove(seleccion-1);    
      aviewer.tp_controles.remove(aviewer.tp_controles.getComponentAt(seleccion));
      
      }
      
    }
    
    public boolean esCombo(String cod){
        boolean val=false;
        //Verifico si el Combo Existe.
        ResultSet resp;
        resp=conexion.consultarBase("select * from combo where cod_combo like '"+cod+"'");
        int filasIn=conexion.obtenerFilas(resp);
        if(filasIn>0){
            val=true;
        }
        
        return val;
    }
    
    
    
    
    public boolean actualizoStock(String cod,int cant){
    boolean insercionVerific=false;    
        try{
            //Actualizo datos del Stock:
            
            //Saco el numero Stock
            System.out.println("*************************************");
            ResultSet r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+cod+"' and cod_bodega="+bodega);
            //  System.out.println("Logra la consulta::::");
            r.next();
            int numeroStock=r.getInt(1);
            //  System.out.println("El codigo es:"+numeroStock);
            int stock=numeroStock-cant;
            
            //Actualizo el numero
            //System.out.println("Actualiza los datos del Item: "+cod+" de: "+numeroStock+" a:"+stock);
            conexion.insertarDatos("update itm_bodega set cantidad="+stock+" where cod_producto like '"+cod+"' and cod_bodega="+bodega);
            
            //Verifico la Actualizacion: (Verifico la Transaccion se realice exitosamente para este producto)
            r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+cod+"' and cod_bodega="+bodega);
            r.next();
            int numeroActual=r.getInt(1);
            if(numeroActual==stock){
                //Transaccion Verificada!:
                insercionVerific=true;
            }
            
            //Actualizo Total en los productos de las diferentes bodegas
            int tot=0;
            ResultSet respuesta=conexion.consultarBase("select sum(cantidad) from itm_bodega where cod_producto like '"+cod+"'");
            respuesta.next();
            tot= respuesta.getInt(1);
            conexion.insertarDatos("UPDATE producto SET stock_total= "+tot+" where cod_producto like '"+cod+"'");
            
            
            //ACTUALIZO INVENTARIO ABIERTO ###################
            //Realizo la actualizacion en el producto del inventario Abierto:
            ResultSet rInv=conexion.consultarBase("SELECT idInventario FROM inventario where abierto=true;");
            System.out.println("REALIZO ACTUALIZACION INVENTARIO");
            System.out.println("INVENTARIO?");
            System.out.println("SELECT idInventario FROM inventario where abierto=true;"+conexion.obtenerFilas(rInv));
            if(conexion.obtenerFilas(rInv)>0){
                System.out.println("Entra en INVENTARIO");
                rInv.beforeFirst();
                rInv.next();
                int codigoInv=rInv.getInt(1);
                System.out.println(" INVENTARIO ABIERTO="+codigoInv);
                //Busco este producto dentro del Inventario:
                ResultSet rPro=conexion.consultarBase("SELECT cantidad_act,cantidad_cont FROM productoinv where cod_inv="+codigoInv+" and cod_producto like '"+cod+"';");
                System.out.println("PRODUCTO?");
                if(conexion.obtenerFilas(rPro)>0){
                System.out.println("PRODUCTO INVENTARIO MOD="+cod);    
                rPro.beforeFirst();
                rPro.next();
                //Valido el cambio de que no sea menor a cero
                int cantAct=cant;
                int cantCont=cant;
                if(rPro.getInt(1)<cantAct){cantAct=0;}
                if(rPro.getInt(2)<cantCont){cantCont=0;}
                
                
                //Actualizo la Cantidad del producto del Inventario:
                  conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act-"+cantAct+", cantidad_cont=cantidad_cont-"+cantCont+" where cod_producto like '"+cod+"';");  
                    
                }else{
                //Este producto fue creado recientemente y no esta dentro de los productos del inventario Abierto:
                   ResultSet rProNuevo=conexion.consultarBase("SELECT cod_producto,cod_categoria,nombre,descripcion,precio_costo,precio_normal,stock_total,precio_distribucion FROM producto p where cod_producto like '"+cod+"';");
                   rProNuevo.beforeFirst();
                   rProNuevo.next();
                   conexion.insertarDatos("insert into prductoinv values("+codigoInv+",'"+rProNuevo.getInt(1)+"','"+rProNuevo.getInt(2)+"','"+rProNuevo.getString(3)+"','"+rProNuevo.getString(4)+"',"+rProNuevo.getDouble(5)+","+rProNuevo.getDouble(6)+","+rProNuevo.getInt(7)+",0,"+rProNuevo.getDouble(8)+");");
                }
                
            }
            //################################################
            
        
        } catch(java.sql.SQLException e){System.out.println("Error Actualizacion");};
        //inserto cabecera factura;
        
        
        
        return insercionVerific;
    }
    private void tablaInputMethodTextChanged(java.awt.event.InputMethodEvent evt) {//GEN-FIRST:event_tablaInputMethodTextChanged
// TODO add your handling code here:
    }//GEN-LAST:event_tablaInputMethodTextChanged
    
    private void formMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseEntered
// TODO add your handling code here:
    }//GEN-LAST:event_formMouseEntered

private void txt_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_descActionPerformed

}//GEN-LAST:event_txt_descActionPerformed

private void txt_descKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyTyped
        //parte utilizada  para solo dejar ingrsar numeros 
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))&& c!='.') {
              getToolkit().beep();
              evt.consume();
        }
}//GEN-LAST:event_txt_descKeyTyped

private void txt_codFacKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyPressed
    //busqueda de la factura para su posterior  anulacion
   
}//GEN-LAST:event_txt_codFacKeyPressed
JTable tabla1=new JTable(100,5);
private void txt_codFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_codFacActionPerformed
    
    if(txt_codFac.getText().equals("")){
        limpiaFactura();
        JOptionPane.showMessageDialog(this,"Ingrese el codigo de la Factura","Error",JOptionPane.ERROR_MESSAGE); 
    }else{
       if(conexion.existeCodigo("pedido","cod_pedido",txt_codFac.getText())){
           if(conexion.tipoComprobante(txt_codFac.getText()).equals("F")){
                if(opcionComprobante==1){
                    if(conexion.verificaAnulacion(txt_codFac.getText(),"F")==true){
                        cargarFactura(txt_codFac.getText());
                    }else{
                        limpiaFactura();
                        JOptionPane.showMessageDialog(this,"La factura no ha sido anulada","Error",JOptionPane.ERROR_MESSAGE); 
                    }
                }else{//----------------
                    if(conexion.verificaAnulacion(txt_codFac.getText(),"F")==false){
                        cargarFactura(txt_codFac.getText());
                    }else{
                        limpiaFactura();
                        JOptionPane.showMessageDialog(this,"La factura ya ha sido anulada","Error",JOptionPane.ERROR_MESSAGE); 
                    }
                }
           }else{
               String tipoComrpobante="";
                if(conexion.tipoComprobante(txt_codFac.getText()).equals("N")){
                    tipoComrpobante="Nota de Venta";
                }
                limpiaFactura();
                JOptionPane.showMessageDialog(this,"El codigo Ingresado no es de una Factura es una "+tipoComrpobante,"Error",JOptionPane.ERROR_MESSAGE); 
           }
       }else{
           limpiaFactura();
           JOptionPane.showMessageDialog(this,"El codigo de la Factura no existe","Error",JOptionPane.ERROR_MESSAGE); 
           
       }
    }
}//GEN-LAST:event_txt_codFacActionPerformed
//carga la factura una vez que se ingrese el codigo 
public void cargarFactura(String codigoFactura){
        jScrollPane1.remove(tabla);
        jScrollPane1.add(tabla1);
        jScrollPane1.setViewportView(tabla1);
        conexion.limpiar(tabla1);
        tabla1.getColumnModel().getColumn(0).setHeaderValue("Codigo");
        tabla1.getColumnModel().getColumn(1).setHeaderValue("Cantidad");
        tabla1.getColumnModel().getColumn(2).setHeaderValue("Articulo");
        tabla1.getColumnModel().getColumn(3).setHeaderValue("PUnitario");
        tabla1.getColumnModel().getColumn(4).setHeaderValue("Total");
        setVisible(true);
        limpiaFactura();
        String consultaCabecera="select c.cod_cliente,c.nombre,c.direccion,c.telefono,p.vendedor_pe,"+
       "p.cod_pedido,p.iva,p.descuento,p.totalNeto,p.total_pagado,p.fecha_pe,p.fecha_anulacion,p.desc_anulacion "+
       "from   cliente c,pedido p,dtl_pedido dtl where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and p.cod_pedido="+codigoFactura+" and dtl.tipoDoc like 'F'   and p.tipo_comprobante like 'F' group by p.cod_pedido";
       java.util.Vector consultaCabFac=conexion.consulta(consultaCabecera);
       java.util.Vector consultaCabFacInt=new java.util.Vector();
       for(int i=0;i<consultaCabFac.size();i++){
           consultaCabFacInt=(java.util.Vector)consultaCabFac.elementAt(i);
           txt_id.setText(consultaCabFacInt.elementAt(0).toString());
           txt_nom.setText(consultaCabFacInt.elementAt(1).toString());
           txt_dir.setText(consultaCabFacInt.elementAt(2).toString());
           txt_tel.setText(consultaCabFacInt.elementAt(3).toString());
           txt_vend.setText(consultaCabFacInt.elementAt(4).toString());
           txt_porIva.setText(consultaCabFacInt.elementAt(6).toString());
           txt_desc.setText(consultaCabFacInt.elementAt(7).toString());
           txt_sub.setText(consultaCabFacInt.elementAt(8).toString());
           txt_tot.setText(consultaCabFacInt.elementAt(9).toString());
           String valIva=txt_porIva.getText().toString();
           if(valIva.equals("")){
                valIva="0";
           }
           double porcentaje=Double.parseDouble(valIva);
           double subtotal=Double.parseDouble(consultaCabFacInt.elementAt(8).toString());
           double descuento=Double.parseDouble(consultaCabFacInt.elementAt(7).toString());
           txt_SubDesc.setText(String.valueOf(nf.format((subtotal-descuento))));
           double iva=((subtotal-descuento)*porcentaje)/100;
           txt_iva.setText(nf.format(iva).replaceAll(",","."));
           lbl_fecha.setText(consultaCabFacInt.elementAt(10).toString());
           try{
               lbl_anulacion.setText(consultaCabFacInt.elementAt(11).toString());
           }catch(java.lang.NullPointerException e){}
           txt_motAnula.setText(consultaCabFacInt.elementAt(12).toString());
       }
       String consultaDetalle="select dtl.cod_producto,dtl.cantidad,pr.nombre,precio_normal,dtl.subtotal "+
       "from   cliente c,pedido p,dtl_pedido dtl,producto pr "+
       "where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and dtl.cod_producto=pr.cod_producto and "+
       "p.cod_pedido="+codigoFactura+" and dtl.tipoDoc like 'F'   and p.tipo_comprobante like 'F'";
       
       java.util.Vector consultaDetlFac=conexion.consulta(consultaDetalle);
       java.util.Vector consultaDetlFacInt=new java.util.Vector();
       for(int i=0;i<consultaDetlFac.size();i++){
           consultaDetlFacInt=(java.util.Vector)consultaDetlFac.elementAt(i);
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(0).toString(), i,0);
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(1).toString(), i,1);
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(2).toString(), i,2);           
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(3).toString(), i,3); 
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(4).toString(), i,4); 
           tabla1.setValueAt(consultaDetlFacInt.elementAt(0).toString(), i,0);
           String cantidad=consultaDetlFacInt.elementAt(1).toString();
           tabla1.setValueAt(cantidad,i,1);//
           tabla1.setValueAt(consultaDetlFacInt.elementAt(2).toString(), i,2);
           String subtotal=consultaDetlFacInt.elementAt(4).toString();
           double precioProducto=Double.parseDouble(subtotal)/Double.parseDouble(cantidad);
           tabla1.setValueAt(String.valueOf(nf.format(precioProducto)), i,3);
           //tabla1.setValueAt(consultaDetlFacInt.elementAt(3).toString(), i,3); //------
           tabla1.setValueAt(subtotal, i,4); //
       }
}
//Metodo para limpiar la tabla y  campos, esto solo en el caso de anulacion de factura
public void limpiaFactura(){
           conexion.limpiar(tabla1);
           txt_id.setText("");
           txt_nom.setText("");
           txt_dir.setText("");
           txt_tel.setText("");
           txt_vend.setText("");
           txt_porIva.setText("0.00");
           txt_desc.setText("0.00");
           txt_sub.setText("0.00");
           txt_tot.setText("0.00");
           txt_iva.setText("0.00");
           txt_porDesc.setText("%");
           lbl_fecha.setText("");
           txt_motAnula.setText("");
           txt_SubDesc.setText("0.00");
           txt_subCosto.setText("0.00");
           if(opcionComprobante==1){
               lbl_anulacion.setText("");
           }    
}
//metodo para desactivar los controles en caso de anulacion de factura
public void desactivaControles(){
            txt_codFac.setVisible(true);
            btn_BuscaFac.setVisible(true);
            btn_anulaFac.setVisible(true);
            this.ReImprimir.setVisible(true);

            lbl_fact.setVisible(false);
            bt_mod.setVisible(false);
            bt_hist.setVisible(false);
            lbl_vend.setVisible(false);
            txt_vend.setVisible(false);
            bt_ap.setVisible(false);
            bt_borrar.setVisible(false);
            ck_desc.setVisible(false);
            bt_limpiar.setVisible(false);
            bt_registra.setVisible(false);
            txt_porDesc.setEnabled(false);
            tabla1.setEnabled(false);
            txt_id.setEnabled(false);
            lbl_fecha.setText("");
            jLabel10.setVisible(true);
            lbl_anulacion.setVisible(true);
            lbl_anulacion.setText(fecha);
            jScrollPane2.setVisible(true);
            this.lbl_etiqueta.setVisible(true);
}
//metodo para la anular la factura
public void  anulaFactura(){
    if(txt_codFac.getText().equals("")){
        JOptionPane.showMessageDialog(this,"Ingrese el codigo de la Factura","Error",JOptionPane.ERROR_MESSAGE); 
    }else{
       if(conexion.existeCodigo("pedido","cod_pedido",txt_codFac.getText())){
           if(conexion.verificaAnulacion(txt_codFac.getText(),"F")==false){
               if(txt_motAnula.getText().equals("")){
                    JOptionPane.showMessageDialog(this,"Debe ingresar el motivo de anulacion","Error",JOptionPane.ERROR_MESSAGE); 
               }else{
                   if(lbl_fecha.getText().compareTo(lbl_anulacion.getText())<=0){
                    int opccion=0;
                    opccion=JOptionPane.showConfirmDialog(this,"Seguro que desea anular esta factura?","Alerta",0);
                    if(opccion==0){
                      try{
                           conexion.consultarBase("START TRANSACTION;");
                           conexion.insertarDatos("update pedido set estato_pe='N',fecha_anulacion='"+lbl_anulacion.getText()+"',desc_anulacion='"+txt_motAnula.getText()+"' where cod_pedido="+txt_codFac.getText()+" and tipo_comprobante like 'F'");
                           String consultaDetalle="select dtl.cod_producto,dtl.cantidad,pr.nombre,precio_normal,dtl.subtotal "+
                           "from  cliente c,pedido p,dtl_pedido dtl,producto pr "+
                           "where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and dtl.cod_producto=pr.cod_producto and "+
                           "p.cod_pedido="+txt_codFac.getText()+" and dtl.tipoDoc like 'F'   and p.tipo_comprobante like 'F'";
                           java.util.Vector consultaDetlFac=conexion.consulta(consultaDetalle);
                           java.util.Vector consultaDetlFacInt=new java.util.Vector();
                           for(int i=0;i<consultaDetlFac.size();i++){
                               consultaDetlFacInt=(java.util.Vector)consultaDetlFac.elementAt(i);
                               //se utiliza el menos por que se utiliza el metodo de actualiza stock que es para 
                               //la factura en el cual el stock se resta y en este caso necesitamos sumar
                               actualizoStock(consultaDetlFacInt.elementAt(0).toString(),-Integer.parseInt(consultaDetlFacInt.elementAt(1).toString()));
                           }
                           asientoAnula(txt_codFac.getText());
                           asientoAnulaCosto(txt_codFac.getText());
                           
                           //Anulo las Cuentas x Cobrar o pagar Relacionadas:
                           anuloCuentasRel(txt_codFac.getText());
                           
                           limpiaFactura();
                           txt_codFac.setText("");
                           conexion.consultarBase("COMMIT;");
                       }catch(Exception es){
                           conexion.consultarBase("ROLLBACK;");
                       }
                    }// fin if(opcion)
                  }else{
                        JOptionPane.showMessageDialog(this,"La fecha de anulacion no debe ser menor al de la emision","Error Hora del Sistema",JOptionPane.ERROR_MESSAGE); 
                  }
               }
           }else{
                        JOptionPane.showMessageDialog(this,"La factura ya ha sido anulada ","Error",JOptionPane.ERROR_MESSAGE); 
           }
       }else{
           limpiaFactura();
           JOptionPane.showMessageDialog(this,"El codigo de la Factura no existe","Error",JOptionPane.ERROR_MESSAGE); 
       }
    }  
}

    public void anuloCuentasRel(String codigo) {
        ResultSet respuesta = conexion.consultarBase("SELECT * FROM cuentaspendientes where cod_factura like 'F" + codigo + "' and pagado like 'falta';");
        int filas = conexion.obtenerFilas(respuesta);
        if (filas > 0) {
            conexion.actualizarBase("update cuentaspendientes set pagado='Anulado' where cod_factura like 'F" + codigo + "' and pagado like 'falta';");
        }
    }


private void txt_codFacKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyTyped
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
              getToolkit().beep();
              evt.consume();
        }
}//GEN-LAST:event_txt_codFacKeyTyped

private void btn_anulaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_anulaFacActionPerformed
             anulaFactura();
}//GEN-LAST:event_btn_anulaFacActionPerformed

private void btn_BuscaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_BuscaFacActionPerformed
      buscarFactura();

}//GEN-LAST:event_btn_BuscaFacActionPerformed

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        tabla.clearSelection();
        bMayor.setVisible(true);
}//GEN-LAST:event_jButton2ActionPerformed

private void txt_subActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_subActionPerformed
// TODO add your handling code here:
    //actualizoTotales();
}//GEN-LAST:event_txt_subActionPerformed

private void ReImprimirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ReImprimirActionPerformed
    // TODO add your handling code here:
    reimprimir();
}//GEN-LAST:event_ReImprimirActionPerformed

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
    // TODO add your handling code here:
    bimg.setVisible(true);

}//GEN-LAST:event_jButton3ActionPerformed

private void subirWebActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_subirWebActionPerformed

    //Pregunto si desea Subir la factura a la Web:
    int opccion=0;
    opccion=JOptionPane.showConfirmDialog(this,"Seguro Desea Subir la Subir Nuevamente la Factura Web?","Alerta",0);
    if(opccion==0){

        int opccion1=0;
        opccion1=JOptionPane.showConfirmDialog(this,"Esta Factura es una Factura X MAYOR?","Alerta",0);
        if(opccion1==0){
          this.ventaMayor="Mayor";
        }else{
            this.ventaMayor="";
        }

    registrarNuevamenteFactWeb(tabla1);

    }



    // TODO add your handling code here:
}//GEN-LAST:event_subirWebActionPerformed

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
    // TODO add your handling code here:
    PanelWeb pweb=new PanelWeb(conexion,bodega);
}//GEN-LAST:event_jButton4ActionPerformed

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
    // TODO add your handling code here:
    RestaurarBodega rb=new RestaurarBodega(conexion,bodega,this);
}//GEN-LAST:event_jButton5ActionPerformed
 
 public void reimprimir(){
//Aqui establezco el metodo en el caso que se necesiten mas copias de una factura emitida:
    String texto="";
    //Escribo la Cabecera:

    String num_Fact;
        //Datos del Cliente:
        String ClienteRucCI = "";
        String ClienteNom = "";
        String ClienteTlf = "";
        String ClienteDir = "";

        //Tipo de Documento:
        String documento;

        //Informacion de la Empresa
        String NombreRS = " daniel1 Andres Silva Palacios";
        String RucEmisor = "0104045323001";
        String DireccionLocal = "Elvira Vega y Luis Sarmiento";
        String AutSRI = "1234567891";
        String FechaCaducidad = "2010-12-31";

        String codEmpresa = "001";
        String codTerminale = "005";
        //Defino Parametros Factura y Datos del Cliente
        ClienteRucCI = txt_id.getText();
        ClienteNom = txt_nom.getText();
        ClienteTlf = txt_tel.getText();
        ClienteDir = txt_dir.getText();
        num_Fact = txt_codFac.getText();


        String cabecera =
                "FACTURA DE ENVIO DE MERCADERIA\n" +
                "BODEGA PRINCIPAL\n" +
                "daniel1 ANDRES SILVA PALACIOS\n_\n" +
                "          Ruc:" + RucEmisor + "\n" +
                "  "+DireccionLocal + "\n" +
                "  AutSRI:" + AutSRI + " F.CAD:" + FechaCaducidad + "\n_\n";



        // String FormaPago="Contado";
        cabecera = cabecera +"Datos del Cliente:\n" +
                "Ruc/CI:" + ClienteRucCI + "  \nTlf:" + ClienteTlf + "\n" +
                "Nom:" + ClienteNom + "\n" +
                "Dir:" + ClienteDir + "\n" +
                "Fecha:"+ lbl_fecha.getText()  +"\n_\n" ;


        //############################
        texto=texto+cabecera;



        String nombreEtiqueta = "\n=========================================\n" +
                "Item              Nombre              Cant     Prec     Sub\n" +
                "===========================================\n";
        texto=texto+nombreEtiqueta+"\n";


    //Inserto Detalle de la factura:
    int alto = tabla1.getRowCount();
    for (int n = 0; n < alto; n++) {
    System.out.println("Entraa:"+n);
       try{
            System.out.println("saca el valor :"+n+" "+0);
            String valordt = tabla1.getValueAt(n, 0).toString();
            System.out.println("El valor que toma de la fila es:" + valordt + ":");

            if (tabla1.getValueAt(n, 0).toString().equals("") || tabla1.getValueAt(n, 0).toString().equals("null") || tabla1.getValueAt(n, 0).toString() == null) {
                System.out.println("Sale del Primer break");
                break;

            } else {
            System.out.println("Entra a tomar los datos:");
                String codigoPro = tabla1.getValueAt(n, 0).toString();
                String cantidadPro = tabla1.getValueAt(n, 1).toString();
                String nombrePro = tabla1.getValueAt(n, 2).toString();
                String precioPro = tabla1.getValueAt(n, 3).toString();
                String totalPro = tabla1.getValueAt(n, 4).toString();
                texto = texto + codigoPro + "     " + cantidadPro + "     " + nombrePro + "     " + precioPro + "      " + totalPro + "\n";
                System.out.println("Agrega este detalle:" + codigoPro + "     " + cantidadPro + "     " + nombrePro + "     " + precioPro + "      " + totalPro + "\n");



            }
       }catch(Exception e){
       break;
       }



        }


        //Pongo el Pie de la Factura:
         String Pie = "=====================================\n_\n" +
                    "Subtotal   =" + txt_sub.getText() + "\n\n" +
                    "Descuento  =" + txt_desc.getText() + "\n" +
                    "Sub-Desc  =" + this.txt_SubDesc.getText() + "\n" +
                    "Iva        =" + this.txt_iva.getText() + "\n_\n" +
                    "TOTAL PAG  =" + this.txt_tot.getText()+"\n";
       //Inserto el Pie
         texto=texto+Pie;
       Imprimir i=new Imprimir();
       i.printString(texto);


}



public void buscarFactura(){
      if(opcionComprobante==1){ //solo para facturas Anuladas
               listaFacturas listaFac=new listaFacturas(conexion,this,1,user);
               listaFac.setVisible(true);
      }else{
               listaFacturas listaFac=new listaFacturas(conexion,this,0,user);
               listaFac.setVisible(true);
      }    

}    


    class MyTableChangedListener implements TableModelListener {
        public void tableChanged(TableModelEvent evt) {
            
            int row = evt.getFirstRow();
            int column = evt.getColumn();
            Object dato1=tabla.getValueAt(row, column);
            String dato=String.valueOf(dato1);
            dato=dato.replaceAll(" ","");
            
            if(dato!="" &&dato!="null"){
                
                
                if(column==1 ){ //Modifico la columna de Cantidad:
                   cambioCantidad(dato,row);
                }
                
                if(column==0 ){ //Modifico la columna del Codigo:
                    //    System.out.println("**************//Cambio en Tabla*/*/*/***********************");
                    //    System.out.println("Los datos obtenidos son:"+row+column);
                    //    System.out.println("El dato es="+dato);
                    //Cuento la fila desocupada:
                   
                    actualizoSubtotal=false;
                    
                    int linea=siExisteCodigo(dato,row);
                    System.out.println("La linea Obtenida es:"+linea+":"+row);
                    if(linea>=0&&silimpio==false){
                        System.out.println("Si LIMPIO ="+silimpio);
                        mostrarDialogo();
                        tabla.setValueAt(null,row, column);
                        metodoActCant(linea);
                        
                    } else{
                        //Consulta a la base de datos el codigo.
                        System.out.println("Obtengo Valores:"+dato+" "+row);
                        obtengoValores(dato,row);
                        actualizoTotales();
                        
                        
                    }
                    
                    actualizoSubtotal=true;
                }
                if(column==1 && dato!=null){
                    //Actualizo El subtotal:
                    if(actualizoSubtotal==true){
                        Object cantidad=tabla.getValueAt(row, column);
                        
                        actualizoSubtotal(cantidad,row);}
                }else{
                    //Hago el cambio de cantidad.
                    //System.out.println("No encontro este producto");
                    actualizoTotales();
                }
                
            }
        }
        
        
    }
    
    public void metodoActCant(int linea){
        System.out.println("Enfoco la linea:"+linea);
         //Enfoco el scroll:
         tabla.addRowSelectionInterval(linea,linea);
         if(linea==0){
         linea=1;}
         tabla.scrollRectToVisible(tabla.getCellRect(linea,1, true));
    }
    
    private void cambioCantidad(String dato, int row) {
        String codigop=tabla.getValueAt(row,0).toString();
        ResultSet resp;
        resp=conexion.consultarBase("select b.cantidad from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codigop+"' and cod_bodega="+bodega );
        int stock=0;
        try {
            resp.beforeFirst();
            resp.next();
            System.out.println("El stock obtenido es:"+stock);
            
            stock=resp.getInt(1);
        } catch (SQLException ex) {
            //ex.printStackTrace();
        }
        
        if(Integer.parseInt(dato.toString())<=stock){
            
        } else{
            JOptionPane.showMessageDialog(this,"Solo hay "+stock+" de este producto. No tenemos "+Integer.parseInt(dato.toString()),"Informacion",JOptionPane.INFORMATION_MESSAGE);
            tabla.setValueAt(stock,row,1);
            
        }
        //actualizoTotales();
    }
    
    
    public void actualizoSubtotal(Object o,int fila){
        int cantidad=Integer.parseInt(o.toString());
        Object p=tabla.getValueAt(fila,3);
        double precio=Double.parseDouble(p.toString());
        double subtotal=cantidad*precio;
        String sub=nf.format(subtotal).replaceAll(",",".");
        tabla.setValueAt(sub, fila, 4);

        p=tabla.getValueAt(fila,5);
        precio=Double.parseDouble(p.toString());
        subtotal=cantidad*precio;
        sub=nf.format(subtotal).replaceAll(",",".");
        tabla.setValueAt(sub, fila, 6);
    }
    public void mostrarDialogo(){
        
        JOptionPane.showMessageDialog(this,"Este codigo ya esta en la Factura","Informacion",JOptionPane.INFORMATION_MESSAGE);
    }
    java.util.Vector vecCostos=new java.util.Vector();
    public void obtengoValores(Object codigo,int fila){
        //Obtengo de la base de datos
        //fila es el dato de entrada
        ResultSet resul=null;
        int NumResp=0;
        try{
            //Saco el Stock:
            String frase="";
            int stock=69;

            //Para el Caso que NO sea un Combo:
            if(!esCombo(codigo.toString())){
                if(ventaMayor.equals("Mayor")){
                    resul=conexion.consultarBase("select i.nombre,i.precio_distribucion,b.cantidad,i.precio_costo from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codigo+"' and cod_bodega="+bodega );
                }else{
                    resul=conexion.consultarBase("select i.nombre,i.precio_normal,b.cantidad,i.precio_costo from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codigo+"' and cod_bodega="+bodega );
                }

                NumResp=conexion.obtenerFilas(resul);
                System.out.println("El numero de filas es:"+NumResp);
                stock=resul.getInt(3);
            }else{

                if(ventaMayor.equals("Mayor")){
                    resul=conexion.consultarBase("select i.nombre,i.precio_distribucion,b.cantidad,i.precio_costo from producto i where i.cod_producto like '"+codigo+"'");
                }else{
                    resul=conexion.consultarBase("select i.nombre,i.precio_normal,b.cantidad,i.precio_costo from producto i where i.cod_producto like '"+codigo+"'");
                }
                NumResp=conexion.obtenerFilas(resul);
                stock=obtenerStockCombo(codigo.toString());
            }

            if(NumResp>0){

                System.out.println("Llega Hasta aquixxxxx El stock es:"+stock);
                String ca="";
                String mens="Ingrese una Cantidad < "+stock;
                int cantidad=0;
                if(stock==0){
                    JOptionPane.showMessageDialog(this,"No existe stock enla bodega de este producto","Informacion",JOptionPane.INFORMATION_MESSAGE);
                    limpiarFila(fila);
                }else{

                    while(ca.equals("")||ca==null||cantidad>stock||cantidad<=0){

                        try{
                            javax.swing.ImageIcon imagen=new javax.swing.ImageIcon("C:\\Users\\Invitado\\Documents\\Programa Bodega\\imagenes\\"+codigo.toString()+".jpg");
                            this.lbl_imagen.setIcon(imagen);
                            ca = JOptionPane.showInputDialog(this,mens,"AVISO",2);


                            if(ca==null){
                                //Aplasto cancel
                                break;
                            }

                            ca=ca.replaceAll(" ","");
                            System.out.println("Lo que escribiste fue:"+ca);
                            cantidad=Integer.parseInt(ca);
                        }catch(Exception e){
                            cantidad=-1;
                        }

                    }

                    if(ca!=null){
                        //int filaSeleccion=tabla.G
                        tabla.setValueAt(nf.format(resul.getDouble(4)).replaceAll(",","."),fila,5);

                        //tabla.getCellRenderer(1,1).getTableCellRendererComponent(tabla, codigo, silimpio, silimpio, s, fila).setBackground(c);
                        double can = Double.parseDouble(ca);
                        //System.out.println("La cantidad es:"+can);
                        tabla.setValueAt(ca,fila,1);

                        //Obtengo y Muestro el Nombre txt_sub
                        String desc=resul.getString(1);
                        System.out.println("El nombre es:"+desc);
                        tabla.setValueAt(desc,fila,2);

                        //Obtengo y Muestro el Precio:
                        double precio = resul.getDouble(2);
                        tabla.setValueAt(nf.format(precio).replaceAll(",","."),fila,3);

                        //obtengo y muestro los subotal de cosoto
                        double precioCosto=resul.getDouble(4);
                        double subCosto=precioCosto*can;
                        tabla.setValueAt(nf.format(subCosto).replaceAll(",","."),fila,6);

                        //Obtengo y Muestro los Totales:
                        double sub=precio*can;
                        //System.out.println("El subtotal es:"+sub);
                        tabla.setValueAt(nf.format(sub).replaceAll(",","."),fila,4);
                    } else{
                        limpiarFila(fila);
                        tabla.clearSelection();

                    }

                }

            }else {
                int opccion=0;
                opccion=JOptionPane.showConfirmDialog(this,"Desea Buscar el Producto","Alerta",0);
                if(opccion==0){

                    b.setVisible(true);
                    String value=String.valueOf(tabla.getValueAt(fila,0));
                    if(value==null||value.equals("")){
                        value="texto";
                    }

                    b.txt_buscar.setText(value);
                    b.muestraBusqueda(value);
                    int filaSeleccionada=tabla.getSelectedRow();
                    limpiarFila(filaSeleccionada);




                }
            }
        }catch(java.sql.SQLException e){
            int opccion=0;
            opccion=JOptionPane.showConfirmDialog(this,"Desea Buscar el Producto","Alerta",0);
            if(opccion==0){

                b.setVisible(true);
                String value=String.valueOf(tabla.getValueAt(fila,0));
                if(value==null||value.equals("")){
                    value="texto";
                }
                
                b.txt_buscar.setText(value);
                b.muestraBusqueda(value);
                int filaSeleccionada=tabla.getSelectedRow();
                limpiarFila(filaSeleccionada);


            }

        };

    }
    
    public int obtenerStockCombo(String codigoCombo){
        //Actualizo Productos del Combo:
        ResultSet resultado;
        resultado=conexion.consultarBase("select * from combo where cod_combo like '"+codigoCombo+"'");
        int PosibleComboPro[]=new int[conexion.obtenerFilas(resultado)];
        try{
            resultado.beforeFirst();
            int i=0;
            while(resultado.next()){
                String codPro=resultado.getString(2);
                int cantPro=resultado.getInt(4);
                
                //Saco el Stock del Producto:
                ResultSet r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codPro+"' and cod_bodega="+bodega);
                r.next();
                int StockProducto=r.getInt(1);
                PosibleComboPro[i]=StockProducto/cantPro;
                i++;
            }
        }catch(SQLException sqle){
            System.out.println("Error al mostrar los resultados de la consulta");
            System.err.println(sqle);
        }
        
        int NumCombos=PosibleComboPro[0];
        for(int j=0;j<PosibleComboPro.length;j++){
            int punt=PosibleComboPro[j];
            
            if(punt<NumCombos){
                NumCombos=punt;
            }
        }
        
        
        
        return NumCombos;
    }
    
    
    
    public void actualizoTotales(){
        // System.out.println("Entra en actualiza");
        int numeroCol=tabla.getRowCount();
        int cont=0;
        double acumula=0;
        double acumulaSubCosto=0;
        String toma;
        String tomaCosto;
        
        //Muestro Los Subtotales:
        while (cont<numeroCol){
            
            try{
                toma=tabla.getValueAt(cont, 4).toString();
                tomaCosto=tabla.getValueAt(cont, 6).toString();
                acumula=acumula+Double.parseDouble(toma);
                acumulaSubCosto=acumulaSubCosto+Double.parseDouble(tomaCosto);
            } catch(Exception e){};
            cont++;
        }
        txt_sub.setText(String.valueOf(nf.format(acumula).replaceAll(",",".")));
        txt_subCosto.setText(String.valueOf(nf.format(acumulaSubCosto).replaceAll(",",".")));
        
        //Muestro el Descuento
        double porcentaje=0;
        double descuento=0;
        if(ck_desc.isSelected()){
            String valDesc=txt_desc.getText();
            if(valDesc.equals("")){
                valDesc="0";
            }
            descuento=Double.parseDouble(valDesc);
        }else{
            if(txt_porDesc.getText().equals("")){
                porcentaje=0;
            }else{
                porcentaje=Double.parseDouble(txt_porDesc.getText());    
            }
            descuento=(acumula*porcentaje)/100;
            txt_desc.setText(nf.format(descuento).replaceAll(",","."));
        }
        //Muestro El IVA
        String valIva=txt_porIva.getText().toString();
         if(valIva.equals("")){
                valIva="0";
            }
        porcentaje=Double.parseDouble(valIva);
        //double iva=(acumula*porcentaje)/100;
        double subDesc=acumula-Double.parseDouble(nf.format(descuento).replaceAll(",","."));
        txt_SubDesc.setText(nf.format(subDesc).replaceAll(",","."));
        double iva=(subDesc*porcentaje)/100;
        txt_iva.setText(nf.format(iva).replaceAll(",","."));
        
        //Muestro Total:
       //double total=(acumula+iva-descuento);
        double total=(subDesc+iva);
        txt_tot.setText(nf.format(total).replaceAll(",","."));
        
    }
    public int siExisteCodigo(Object codigo,int filaActual){
        // Busca si existe el Codigo:
        int numeroFil=tabla.getRowCount();
        int cont=0;
        
        Object toma;
        while (cont<numeroFil){
            try{
                toma=tabla.getValueAt(cont, 0);
                //System.out.println("Compara: "+codigo+" "+toma);
                if(toma.equals(codigo)&& filaActual!=cont){
                  //  System.out.println("Es igual");
                    return cont;
                   
                }
            } catch(Exception e){}
           cont++;
        }
        
        return cont=-1;
    }
    
   
    
    public void limpiarFila(int fila){
        if(fila<=0){fila=1;}
        tabla.setValueAt(null,fila,0);
        tabla.setValueAt("",fila,1);
        tabla.setValueAt("",fila,2);
        tabla.setValueAt("",fila,3);
        tabla.setValueAt("",fila,4);
        actualizoTotales();
    }
    public int cuentaFilaOcupadas(){
        int totalfilas=tabla.getRowCount();
        int contador=0;
        Object valor;
        for (contador=0;contador<totalfilas;contador++) {
            valor=tabla.getValueAt(contador,0);
            if (valor==null){
                break;
            }
            
        }
        //System.out.println("El numero de fila ocupadas es:"+contador);
        return contador;
    }
    
    public int cuentaProductos(){
    
    int totalfilas=tabla.getRowCount();     
    //System.out.println("El total filas es:"+totalfilas);
    int totalProductos=0;
    int cuentanulls=0;
    
    Object valor;
    for(int contador=0;contador<totalfilas;contador++) {
        valor=tabla.getValueAt(contador,0);
      //  System.out.println(contador+")valor es:"+valor+"\n");
        if(valor==null){
        //System.out.print("El producto es null");
        cuentanulls++;    
        }else{
        //System.out.print("El producto NO es null");    
        totalProductos++;
        }
        
    }

    //System.out.println("El total de nulls es: "+cuentanulls);
   //System.out.println("El total de productos son: "+totalProductos);
    return totalProductos;
    };

    //Cuenta de la tabla del Visor
    public int cuentaVisorProductos(JTable tabla){

    int totalfilas=tabla.getRowCount();
    //System.out.println("El total filas es:"+totalfilas);
    int totalProductos=0;
    int cuentanulls=0;

    Object valor;
    for(int contador=0;contador<totalfilas;contador++) {
        valor=tabla.getValueAt(contador,0);
      //  System.out.println(contador+")valor es:"+valor+"\n");
        if(valor==null){
        //System.out.print("El producto es null");
        cuentanulls++;
        }else{
        //System.out.print("El producto NO es null");
        totalProductos++;
        }

    }
    
   //System.out.println("El total de nulls es: "+cuentanulls);
   //System.out.println("El total de productos son: "+totalProductos);
    return totalProductos;
    };
    //consultar el valor del iva de la tabla parametros
    //el valor del iva que se toma es el ultimo valor ingresado
    public String consultarIva(){
        String iva="";
        java.util.Vector vecConsulta=conexion.consulta("select iva from parametros order by codigo desc limit 1");
        java.util.Vector vecInterno=new java.util.Vector();
        for(int i=0;i<vecConsulta.size();i++){
                vecInterno=(java.util.Vector)vecConsulta.elementAt(i);
                iva=vecInterno.elementAt(0).toString();
        }
        return iva;
    };
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton ReImprimir;
    private javax.swing.JLabel Sub_Desc;
    public javax.swing.JButton bt_ap;
    public javax.swing.JButton bt_borrar;
    public javax.swing.JButton bt_hist;
    public javax.swing.JButton bt_limpiar;
    public javax.swing.JButton bt_mod;
    public javax.swing.JButton bt_registra;
    public javax.swing.JButton btn_BuscaFac;
    public javax.swing.JButton btn_anulaFac;
    private javax.swing.JCheckBox ck_desc;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    public javax.swing.JLabel lbl_anulacion;
    public javax.swing.JLabel lbl_etiqueta;
    private javax.swing.JLabel lbl_f;
    public javax.swing.JTextField lbl_fact;
    private javax.swing.JLabel lbl_fecha;
    public javax.swing.JLabel lbl_fechaAnulacion;
    private javax.swing.JLabel lbl_imagen;
    private javax.swing.JLabel lbl_vend;
    private javax.swing.JButton subirWeb;
    public javax.swing.JTable tabla;
    private javax.swing.JTextField txt_SubDesc;
    public javax.swing.JTextField txt_codFac;
    private javax.swing.JTextField txt_desc;
    public javax.swing.JTextField txt_dir;
    public javax.swing.JTextField txt_id;
    private javax.swing.JTextField txt_iva;
    public javax.swing.JTextArea txt_motAnula;
    public javax.swing.JTextField txt_nom;
    private javax.swing.JTextField txt_porDesc;
    private javax.swing.JTextField txt_porIva;
    private javax.swing.JTextField txt_sub;
    private javax.swing.JTextField txt_subCosto;
    public javax.swing.JTextField txt_tel;
    public javax.swing.JTextArea txt_tot;
    private javax.swing.JPasswordField txt_vend;
    // End of variables declaration//GEN-END:variables
    
}
